package br.com.prontuario.faces;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

import org.primefaces.context.RequestContext;

import br.com.prontuario.entidade.Especie;
import br.com.prontuario.logica.contract.DefaultLogicaContract;
import br.com.prontuario.util.FacesUtil;
import br.com.prontuario.util.StringUtil;

@ManagedBean(name="especieFaces")
@ViewScoped
public class EspecieFaces extends FacesUtil {
	
	private static final long serialVersionUID = 1L;

	@ManagedProperty(value = "#{logicaDefault}")
	private DefaultLogicaContract<Especie> logicaEspecie;
	
	private Especie especie = new Especie();
	private List<Especie> listaEspecie = new ArrayList<>();
	private String especieBusca;
	private String nomeTemplate;

	private Boolean isPopup = false;

	public EspecieFaces() {
		Boolean popup = (Boolean) getSession().getAttribute("isPopup");
		if (popup != null) {
			isPopup = popup;
		}
	}
	
	@PostConstruct
	public void init() {
		this.buscarEspecie();
		if (isPopup != null && isPopup) {
			nomeTemplate = "/templates/templateDialog.xhtml";
		} else {
			nomeTemplate = "/templates/template.xhtml";
		}
	}
	
	@PreDestroy
	public void finalizar() {
		getSession().setAttribute("isPopup", null);
	}
	
	public void adicionar() {
		try {
			if (validaCampos()) {
				logicaEspecie.adicionar(especie);
				adicionarMensagem("Espécie adicionada com sucesso");
				this.buscarEspecie();
				fecharModal("dialogEspecie");
			} else {
				return;
			}
			
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao adicionar a Espécie");
		}
	}
	
	public void prepararAdicionar() {
		this.especie = new Especie();
		abrirModal("dialogEspecie");
	}
	
	public void selecionarRegistro(Long idArea, boolean editar) {
		try {
			this.especie = logicaEspecie.obterPorId(Especie.class,idArea);
			
			if (editar) {
				abrirModal("dialogEspecie");
			} else {
				abrirModal("dialogExcluir");
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void editar() {
		try {
			if (validaCampos()) {
				logicaEspecie.editar(this.especie);
				adicionarMensagem("Espécie editada com sucesso");
				fecharModal("dialogEspecie");
				this.buscarEspecie();
			} else {
				return;
			}
			
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao editar a Espécie");
		}
	}
	
	public void remover() {
		try {
			logicaEspecie.remover(Especie.class, this.especie.getId());
			adicionarMensagem("Espécie removida com sucesso");
			fecharModal("dialogExcluir");
			this.buscarEspecie();
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao remover a Espécie");
		}
	}
	
	public void buscarEspecie() {
		if (listaEspecie != null) {
			this.listaEspecie.clear();
		}
		String campoBuscaOrdenacao = "especie";
		try {
			if (!StringUtil.textoPreenchido(especieBusca)) {
				this.listaEspecie =  logicaEspecie.buscarTodos(Especie.class, campoBuscaOrdenacao);
			} else {
				this.listaEspecie = logicaEspecie.buscarPorCampo(Especie.class, campoBuscaOrdenacao, especieBusca, campoBuscaOrdenacao);
			}
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao buscar as informações");
		}
	}
	
	public boolean validaCampos() {
		boolean valido = true;
		
		if (!StringUtil.textoPreenchido(this.especie.getEspecie())) {
			adicionarMensagem("O campo nome é obrigatório");
			valido = false;
		}
		return valido;
	}
	
	public List<Especie> autoComplete(String query) {
		List<Especie> suggestions = new ArrayList<>();
		if (query.length() > 2) {
			try {
				suggestions = logicaEspecie.buscarPorCampo(Especie.class, "especie", query, "especie");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return suggestions;
    }
	
	public void selecionarNoDialog(Especie especie) {
        RequestContext.getCurrentInstance().closeDialog(especie);
    }


	public Especie getEspecie() {
		return especie;
	}

	public void setEspecie(Especie especie) {
		this.especie = especie;
	}

	public List<Especie> getListaEspecie() {
		return listaEspecie;
	}

	public void setListaEspecie(List<Especie> listaEspecie) {
		this.listaEspecie = listaEspecie;
	}

	public String getEspecieBusca() {
		return especieBusca;
	}

	public void setEspecieBusca(String especieBusca) {
		this.especieBusca = especieBusca;
	}

	public void setLogicaEspecie(DefaultLogicaContract<Especie> logicaEspecie) {
		this.logicaEspecie = logicaEspecie;
	}

	public Boolean getIsPopup() {
		return isPopup;
	}

	public void setIsPopup(Boolean isPopup) {
		this.isPopup = isPopup;
	}

	public String getNomeTemplate() {
		return nomeTemplate;
	}

	public void setNomeTemplate(String nomeTemplate) {
		this.nomeTemplate = nomeTemplate;
	}
	
	
}